From 4fe70c2f8c4c43527fd66fc852bdff6eaaeb33c6 Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Sat, 5 Feb 2005 12:52:28 +0000 Subject: [PATCH] bitkeeper revision 1.1159.246.2 (4204c18cvI5Uk50dXB8wqfQwKj9ZGw) Manual merge. Signed-off-by: keir.fraser@Cl.cam.ac.uk --- xen/arch/x86/traps.c | 15 +++++++++++---- xen/common/schedule.c | 14 +++++++------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index b7e3ba006b..55c767bdca 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -567,14 +567,14 @@ asmlinkage void io_check_error(struct xen_regs *regs) fatal_trap(TRAP_nmi, regs); } -static void unknown_nmi_error(unsigned char reason, struct xen_regs * regs) +static void unknown_nmi_error(unsigned char reason) { printk("Uhhuh. NMI received for unknown reason %02x.\n", reason); printk("Dazed and confused, but trying to continue\n"); printk("Do you have a strange power saving mode enabled?\n"); } -asmlinkage void do_nmi(struct xen_regs * regs, unsigned long reason) +asmlinkage void do_nmi(struct xen_regs *regs, unsigned long reason) { ++nmi_count(smp_processor_id()); @@ -583,7 +583,7 @@ asmlinkage void do_nmi(struct xen_regs * regs, unsigned long reason) nmi_watchdog_tick(regs); else #endif - unknown_nmi_error((unsigned char)(reason&0xff), regs); + unknown_nmi_error((unsigned char)(reason&0xff)); } unsigned long nmi_softirq_reason; @@ -671,6 +671,13 @@ asmlinkage int do_spurious_interrupt_bug(struct xen_regs *regs) return EXCRET_not_a_fault; } +BUILD_SMP_INTERRUPT(deferred_nmi, TRAP_deferred_nmi) +asmlinkage void smp_deferred_nmi(struct xen_regs regs) +{ + ack_APIC_irq(); + do_nmi(®s, 0); +} + void set_intr_gate(unsigned int n, void *addr) { _set_gate(idt_table+n,14,0,addr); @@ -728,7 +735,7 @@ void __init trap_init(void) set_intr_gate(TRAP_alignment_check,&alignment_check); set_intr_gate(TRAP_machine_check,&machine_check); set_intr_gate(TRAP_simd_error,&simd_coprocessor_error); - set_intr_gate(TRAP_deferred_nmi,&nmi); + set_intr_gate(TRAP_deferred_nmi,&deferred_nmi); #if defined(__i386__) _set_gate(idt_table+HYPERCALL_VECTOR, 14, 1, &hypercall); diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 46176cf820..e0fafa6b9c 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -373,13 +373,6 @@ void __enter_scheduler(void) task_slice_t next_slice; s32 r_time; /* time for new dom to run */ - if ( !is_idle_task(current->domain) ) - { - LOCK_BIGLOCK(current->domain); - cleanup_writable_pagetable(prev->domain); - UNLOCK_BIGLOCK(current->domain); - } - perfc_incrc(sched_run); spin_lock_irq(&schedule_data[cpu].schedule_lock); @@ -429,6 +422,13 @@ void __enter_scheduler(void) perfc_incrc(sched_ctx); + if ( !is_idle_task(current->domain) ) + { + LOCK_BIGLOCK(current->domain); + cleanup_writable_pagetable(prev->domain); + UNLOCK_BIGLOCK(current->domain); + } + #if defined(WAKE_HISTO) if ( !is_idle_task(next) && next->wokenup ) { ulong diff = (ulong)(now - next->wokenup); -- 2.30.2